 /****************************************************************************************************************************
 * Copyright © dimon.chen 2024-2034 All right reserved. GPL2.0 License 
 * 文件名   :   led.s
 * 作者     :   dimon.chen
 * 版本     :   V1.0
 * 描述     :   正点原子I.MX6U ALPHA/Mini 开发板Linuxa之ARM裸机开发
 *              裸机实验1 汇编点灯
 *              使用汇编语言来点亮开发板的LED灯，学习和掌握如何使用汇编
 *              完成对 I.MX6U 处理器的 GPIO 初始化
 * 其它     :   无
 * 日期     :   2024-04-29 15:52 
 * 历史     ：  出版本V1.0 2024/04/26 dimon.chen 创建
 *              正点原子[二期]Linux之ARM裸机开发，第8.1 讲使用汇编语言准备C语言运行环境，并使用C语言实现LED灯点灯程序
 ****************************************************************************************************************************/

 #include "main.h"


 /****************************************************************************************************************************
  * 函数名   :   clk_enable
  * 描述     :   初始化外设时钟
  * 输入参数 :   无
  * 输出参数 :   无
  * ****************************************************************************************************************************/
void clk_enable(void)
{
    CCM_CCGR0 = 0xFFFFFFFF;
    CCM_CCGR1 = 0xFFFFFFFF;
    CCM_CCGR2 = 0xFFFFFFFF;
    CCM_CCGR3 = 0xFFFFFFFF;
    CCM_CCGR4 = 0xFFFFFFFF;
    CCM_CCGR5 = 0xFFFFFFFF;
    CCM_CCGR6 = 0xFFFFFFFF;

}

  /****************************************************************************************************************************
  * 函数名   :   led_init
  * 描述     :   初始化LED灯
  * 输入参数 :   无
  * 输出参数 :   无
  * ****************************************************************************************************************************/

void led_init(void)
{
    /* 复用IO为GPIO，设置IO的电气特性 */
    IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0x5;         //IO复用为GPIO模式
    IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 = 0x10B0;      //IO电气特性


    /* GPIO初始化 */
    GPIO1_GDIR = 0x08;      //GPIO1 bit3 -> 1 outpt 
    GPIO1_DR = 0x0;         //output 低电平

}

/* turn on led */ 
void led_on(void)
{
    GPIO1_DR &= ~(1<<3);    //clean bit3 to 0     
}

/* turn off led */
void led_off(void)
{
    GPIO1_DR |= (1<<3);     //set bit3 to 1
}

/* short delay */
void delay_short(volatile unsigned int delay){
    while(delay--)
    {
        ;
    }
}

  /****************************************************************************************************************************
  * 函数名   :   delay
  * 描述     :   延时函数，在 396MHz 的主频下延时时间约为1ms
  * 输入参数 :   要延时的 ms 数
  * 输出参数 :   无
  * ****************************************************************************************************************************/

void delay(volatile unsigned int n){
    while(n--){
        delay_short(0x7ff);
    }
}

int main(void)
{
    clk_enable();
    led_init();

    while(1){
        led_on();
        delay(50);
        led_off();
        delay(50);
    }

    return 0;
}

